$ \ $
$ \ $ $ \ $
$ \ $
A sífilis é uma doença classificada em estágios. A primária ocorre assim que há a infecção pela bactéria Treponema pallidum, causadora da doença; com feridas indolores no local de infecção (região genital), que desaparecem em cerca de até 10 dias, mesmo sem tratamento (a bactéria torna-se inativa no organismo). A secundária acontece cerca de duas a oito semanas após as primeiras feridas se formarem. Aproximadamente 33% daqueles que não trataram a sífilis primária desenvolvem o segundo estágio; podem apresentar vermelhidão pelo corpo, coceira, aparecimento de íngua nas axilas e pescoço, além de outros sintomas que também geralmente desaparecem sem tratamento e, mais uma vez, a bactéria fica inativa no organismo. E a terciária, que é a mais difícil de ser detectada, pois têm sintomas em grandes vasos (como a aorta), cérebro, olhos, coração, podendo causar dor de cabeça, epilepsia, e é um diagnóstico um pouco mais complicado.
Este nosso estudo foi realizado com base no gênero e regiões do Brasil dentre os anos de 2011 a 2021. Sendo assim, foram efetuados dois tipos de teste nesta análise:
OBS.: Não foi considerado o efeito do tempo nas comparações de médias e de distribuições, ou seja, os anos serão como "rótulos das amostras".
As amostras de cada ano dentro de uma região foram consideradas independentes tendo as seguintes ponderações:
As bibliotecas utilizadas nas análises e o tratamento dos dados sobre os casos de infecções por sífilis no Brasil estão nos blocos de código abaixo.
Os dados forma obtidos na página http://indicadoressifilis.aids.gov.br/.
# Importando bibliotecas utilizadas
import pandas as pd
import plotly.express as px
import matplotlib.pyplot as plt
import scipy.stats as st
import seaborn as sns
import numpy as np
# from google.colab import drive
# drive.mount('/content/gdrive')
# Importando base de dados e fazendo os devidos ajustes
data = pd.read_excel('base de dados(novo).xlsx')
data['Ano'] = data['Ano'].astype(int)
data = data.dropna()
# Criação da coluna de casos totais de sífilis no Brasil e em suas regiões
data['Total'] = data['Homens'] + data['Mulheres']
data
tab = pd.DataFrame(columns = data.columns)
# Tabela auxiliar para calcular a taxa de infecção por 100 mil habitantes no Brasil
for i in ['Homens', 'Mulheres', 'Ano']:
tab[i] = data.groupby(by = ['Ano']).sum().loc[:, ['Homens', 'Mulheres']].reset_index()[i]
for i in data['Ano'].drop_duplicates():
tab.loc[:, 'Infecções por 100 mil habitantes'][tab['Ano'] == i] = \
data[data['Ano']==i]['Total'].sum()/(data[data['Ano']==i]['Total']/data[data['Ano']==i]['Infecções por 100 mil habitantes']).sum()
tab['Total'] = tab['Homens'] + tab['Mulheres']
tab['Região'] = 'Brasil'
# União da tabela auxiliar com a tabela original
data_taxas = pd.concat([data, tab]).reset_index(drop=True)
display(data_taxas)
<ipython-input-2-766a036170af>:17: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy tab.loc[:, 'Infecções por 100 mil habitantes'][tab['Ano'] == i] = \ <ipython-input-2-766a036170af>:17: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy tab.loc[:, 'Infecções por 100 mil habitantes'][tab['Ano'] == i] = \ <ipython-input-2-766a036170af>:17: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy tab.loc[:, 'Infecções por 100 mil habitantes'][tab['Ano'] == i] = \ <ipython-input-2-766a036170af>:17: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy tab.loc[:, 'Infecções por 100 mil habitantes'][tab['Ano'] == i] = \ <ipython-input-2-766a036170af>:17: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy tab.loc[:, 'Infecções por 100 mil habitantes'][tab['Ano'] == i] = \ <ipython-input-2-766a036170af>:17: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy tab.loc[:, 'Infecções por 100 mil habitantes'][tab['Ano'] == i] = \ <ipython-input-2-766a036170af>:17: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy tab.loc[:, 'Infecções por 100 mil habitantes'][tab['Ano'] == i] = \ <ipython-input-2-766a036170af>:17: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy tab.loc[:, 'Infecções por 100 mil habitantes'][tab['Ano'] == i] = \ <ipython-input-2-766a036170af>:17: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy tab.loc[:, 'Infecções por 100 mil habitantes'][tab['Ano'] == i] = \ <ipython-input-2-766a036170af>:17: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy tab.loc[:, 'Infecções por 100 mil habitantes'][tab['Ano'] == i] = \
| Homens | Mulheres | Infecções por 100 mil habitantes | Ano | Região | Total | |
|---|---|---|---|---|---|---|
| 0 | 296 | 219 | 3.2 | 2011 | Norte | 515 |
| 1 | 469 | 387 | 5.2 | 2012 | Norte | 856 |
| 2 | 787 | 693 | 8.7 | 2013 | Norte | 1480 |
| 3 | 968 | 772 | 10.1 | 2014 | Norte | 1740 |
| 4 | 1258 | 928 | 12.5 | 2015 | Norte | 2186 |
| 5 | 2349 | 1732 | 23.0 | 2016 | Norte | 4081 |
| 6 | 3572 | 2541 | 34.1 | 2017 | Norte | 6113 |
| 7 | 5781 | 4188 | 54.8 | 2018 | Norte | 9969 |
| 8 | 6606 | 4160 | 58.4 | 2019 | Norte | 10766 |
| 9 | 5259 | 2976 | 44.1 | 2020 | Norte | 8235 |
| 10 | 1034 | 1009 | 3.8 | 2011 | Nordeste | 2043 |
| 11 | 1309 | 1204 | 4.7 | 2012 | Nordeste | 2513 |
| 12 | 1474 | 1889 | 6.0 | 2013 | Nordeste | 3363 |
| 13 | 1976 | 2331 | 7.7 | 2014 | Nordeste | 4307 |
| 14 | 3128 | 3659 | 12.0 | 2015 | Nordeste | 6787 |
| 15 | 5123 | 5254 | 18.2 | 2016 | Nordeste | 10377 |
| 16 | 7989 | 7534 | 27.1 | 2017 | Nordeste | 15523 |
| 17 | 15740 | 10874 | 46.9 | 2018 | Nordeste | 26614 |
| 18 | 14893 | 9677 | 43.1 | 2019 | Nordeste | 24570 |
| 19 | 10089 | 5499 | 27.2 | 2020 | Nordeste | 15588 |
| 20 | 8225 | 4981 | 16.3 | 2011 | Sudeste | 13206 |
| 21 | 12193 | 7172 | 23.8 | 2012 | Sudeste | 19365 |
| 22 | 16597 | 9980 | 31.5 | 2013 | Sudeste | 26577 |
| 23 | 20184 | 11996 | 37.8 | 2014 | Sudeste | 32180 |
| 24 | 25172 | 14084 | 45.8 | 2015 | Sudeste | 39256 |
| 25 | 30729 | 18665 | 57.2 | 2016 | Sudeste | 49394 |
| 26 | 39116 | 24104 | 72.7 | 2017 | Sudeste | 63220 |
| 27 | 44699 | 27722 | 82.6 | 2018 | Sudeste | 72421 |
| 28 | 44022 | 28017 | 81.6 | 2019 | Sudeste | 72039 |
| 29 | 35152 | 19401 | 61.3 | 2020 | Sudeste | 54553 |
| 30 | 923 | 663 | 5.8 | 2011 | Sul | 1586 |
| 31 | 2318 | 1635 | 14.3 | 2012 | Sul | 3953 |
| 32 | 3574 | 2571 | 21.3 | 2013 | Sul | 6145 |
| 33 | 6027 | 4191 | 35.2 | 2014 | Sul | 10218 |
| 34 | 9788 | 7571 | 59.4 | 2015 | Sul | 17359 |
| 35 | 12210 | 9509 | 73.8 | 2016 | Sul | 21719 |
| 36 | 16134 | 13175 | 98.9 | 2017 | Sul | 29309 |
| 37 | 20398 | 16872 | 125.3 | 2018 | Sul | 37270 |
| 38 | 19846 | 16192 | 120.3 | 2019 | Sul | 36038 |
| 39 | 15483 | 11709 | 90.1 | 2020 | Sul | 27192 |
| 40 | 509 | 350 | 6.0 | 2011 | Centro-Oeste | 859 |
| 41 | 749 | 480 | 8.5 | 2012 | Centro-Oeste | 1229 |
| 42 | 1011 | 740 | 11.7 | 2013 | Centro-Oeste | 1751 |
| 43 | 1324 | 783 | 13.9 | 2014 | Centro-Oeste | 2107 |
| 44 | 2405 | 1296 | 24.1 | 2015 | Centro-Oeste | 3701 |
| 45 | 3596 | 1878 | 35.1 | 2016 | Centro-Oeste | 5474 |
| 46 | 4991 | 2947 | 50.1 | 2017 | Centro-Oeste | 7938 |
| 47 | 8288 | 4569 | 80.1 | 2018 | Centro-Oeste | 12857 |
| 48 | 7967 | 4439 | 76.4 | 2019 | Centro-Oeste | 12406 |
| 49 | 6488 | 3148 | 59.0 | 2020 | Centro-Oeste | 9636 |
| 50 | 10987 | 7222 | 9.457412 | 2011 | Brasil | 18209 |
| 51 | 17038 | 10878 | 14.434531 | 2012 | Brasil | 27916 |
| 52 | 23443 | 15873 | 19.536046 | 2013 | Brasil | 39316 |
| 53 | 30479 | 20073 | 24.966201 | 2014 | Brasil | 50552 |
| 54 | 41751 | 27538 | 33.908868 | 2015 | Brasil | 69289 |
| 55 | 54007 | 37038 | 44.166995 | 2016 | Brasil | 91045 |
| 56 | 71802 | 50301 | 58.803293 | 2017 | Brasil | 122103 |
| 57 | 94906 | 64225 | 76.354624 | 2018 | Brasil | 159131 |
| 58 | 93334 | 62485 | 74.22781 | 2019 | Brasil | 155819 |
| 59 | 72471 | 42733 | 54.473126 | 2020 | Brasil | 115204 |
# Manipulação da tabela inicial para o formato adequado para fazer plotagens com a biblioteca Plotly
aux = ['Homens']*data_taxas['Homens'].shape[0] + ['Mulheres']*data_taxas['Mulheres'].shape[0] + ['Total']*data_taxas['Total'].shape[0]
data_casos = pd.DataFrame({'Casos': pd.concat([data_taxas['Homens'], data_taxas['Mulheres'], data_taxas['Total']]), 'Gênero': aux, 'Ano': (data_taxas['Ano'].to_list())*3, \
'Região': (data_taxas['Região'].to_list())*3})
display(data_casos)
| Casos | Gênero | Ano | Região | |
|---|---|---|---|---|
| 0 | 296 | Homens | 2011 | Norte |
| 1 | 469 | Homens | 2012 | Norte |
| 2 | 787 | Homens | 2013 | Norte |
| 3 | 968 | Homens | 2014 | Norte |
| 4 | 1258 | Homens | 2015 | Norte |
| ... | ... | ... | ... | ... |
| 55 | 91045 | Total | 2016 | Brasil |
| 56 | 122103 | Total | 2017 | Brasil |
| 57 | 159131 | Total | 2018 | Brasil |
| 58 | 155819 | Total | 2019 | Brasil |
| 59 | 115204 | Total | 2020 | Brasil |
180 rows × 4 columns
Após o tratameno e organização dos dados, foram gerados os seguintes dataframes:
Alguns gráficos de boxplots e de dispersão foram gerados para avaliação prévia do comportamento dos dados.
# Boxplot das taxas de infecção por região
fig = px.box(data_taxas[data_taxas['Região'] != 'Brasil'], y = 'Infecções por 100 mil habitantes', x = 'Região', title = 'Agrupamento das taxas por região ao longo dos anos')
fig.update_traces(quartilemethod = 'inclusive')
fig.show()
A região Sul mostrou maior variabilidade nas taxas de infecção ao longo dos anos, visto que apresentou o boxplot plot com maior amplitude. Já a região Nordeste apresentou os menores valor máximo, amplitude e mediana, indicando ser a região com menor variabilidade nas taxas e com os melhores indicadores relacionados ao controle da sífilis no país. Pela distribuição dos boxplots, é esperado que haja uma rejeição no teste de variâncias iguais para as cinco regiões e por isso foi decidido de antemão testar as taxas médias para as regiões tomadas duas a duas.
# Função auxiliar para os títulos dos boxplots dos números de casos por gênero e por região
aux_reg = lambda reg: 'no ' + reg if reg == 'Brasil' else 'na região ' + reg
# Boxplot dos números de casos por gênero e por região
for reg in data_casos['Região'].drop_duplicates():
fig = px.box(data_casos[(data_casos['Região'] == reg) & (data_casos['Gênero'] != 'Total')], y = 'Casos', x = 'Gênero', title = 'Agrupamento do números de casos por gênero '+ aux_reg(reg) +' ao longo dos anos')
fig.update_traces(quartilemethod = 'inclusive')
fig.show()
Para todas as regiões, os casos de infecções em homens apresentaram maior variabilidade e maiores valores máximos. Apenas a região Norte apresentou mediana maior entre as mulheres comparadas com os homens. Porém, devido à dispersão dos dados, mesmo para região Norte, existe a tendência de média maior de casos para os homens.
Como pressupomos a igualdade nas populações de homens e de mulheres, uma comapração relativa entre os gêneros continuaria indicando mais infecções entre homens. Uma possível explicação para o fato de os homens possuírem mais casos de infecção em relação às mulheres pode ser que a transmissão de sífilis entre indíviduos de mesmo gênero é mais comum para homens do que para mulheres.
# Transformação necessária para exibir todos os anos no eixo x do gráfico
data_taxas['Ano'] = data_taxas['Ano'].astype(str)
fig = px.line(data_taxas.loc[data_taxas['Região'] != 'Brasil'],x = 'Ano', y = 'Infecções por 100 mil habitantes', color = 'Região', title = 'Taxa de infecção por sífilis ao longo dos anos', markers=True)
fig.show()
O gráfico acima indica que as taxas de infecção por região ao longo dos anos têm tendência a uma distribuição normal com assimetria à esquerda (ou negativa), mesmo com os anos ordenados, visto que não será levado em conta o efeito do tempo nas regiões e cada ano pode ser visto como um "rótulo" para as amostras de taxas de cada região.
# Transformação necessário para exibir todos os anos no eixo x dos gráficos
data_casos['Ano'] = data_casos['Ano'].astype(str)
for i in data_casos['Região'].drop_duplicates():
aux = lambda i: 'Região ' + i if (i!='Brasil') else i
fig = px.line(data_casos[data_casos['Região'] == i], x = 'Ano', y = 'Casos', color = 'Gênero', title = 'Quantidade de casos de sífilis por ano - ' + aux(i), markers=True)
# scatter()
fig.show()
Assim como foi observado nas taxas ao longo dos anos para cada região, os números de casos para cada gênero ao longo dos anos para cada região também mostram tendência à distribuição normal com assimetria à esquerda. Portanto, espera-se que a normalidade para todas as distribuições consideradas nesta análise não possam ser rejeitadas pelo teste de Shapiro-Wilk.
Abaixo seguem algumas tabelas descritivas sobre os números de casos por gênero para cada região.
for i in data_taxas['Região'].drop_duplicates():
print('Casos - ' + i)
display(data_taxas[data_taxas['Região'] == i].describe().round(2))
print('\n')
Casos - Norte
| Homens | Mulheres | Total | |
|---|---|---|---|
| count | 10.00 | 10.00 | 10.00 |
| mean | 2734.50 | 1859.60 | 4594.10 |
| std | 2395.94 | 1517.02 | 3902.47 |
| min | 296.00 | 219.00 | 515.00 |
| 25% | 832.25 | 712.75 | 1545.00 |
| 50% | 1803.50 | 1330.00 | 3133.50 |
| 75% | 4837.25 | 2867.25 | 7704.50 |
| max | 6606.00 | 4188.00 | 10766.00 |
Casos - Nordeste
| Homens | Mulheres | Total | |
|---|---|---|---|
| count | 10.00 | 10.00 | 10.00 |
| mean | 6275.50 | 4893.00 | 11168.50 |
| std | 5639.46 | 3526.66 | 9084.05 |
| min | 1034.00 | 1009.00 | 2043.00 |
| 25% | 1599.50 | 1999.50 | 3599.00 |
| 50% | 4125.50 | 4456.50 | 8582.00 |
| 75% | 9564.00 | 7025.25 | 15571.75 |
| max | 15740.00 | 10874.00 | 26614.00 |
Casos - Sudeste
| Homens | Mulheres | Total | |
|---|---|---|---|
| count | 10.00 | 10.00 | 10.00 |
| mean | 27608.90 | 16612.20 | 44221.10 |
| std | 13149.67 | 8284.56 | 21406.78 |
| min | 8225.00 | 4981.00 | 13206.00 |
| 25% | 17493.75 | 10484.00 | 27977.75 |
| 50% | 27950.50 | 16374.50 | 44325.00 |
| 75% | 38125.00 | 22928.25 | 61053.25 |
| max | 44699.00 | 28017.00 | 72421.00 |
Casos - Sul
| Homens | Mulheres | Total | |
|---|---|---|---|
| count | 10.00 | 10.00 | 10.00 |
| mean | 10670.10 | 8408.80 | 19078.90 |
| std | 7239.35 | 6013.65 | 13247.76 |
| min | 923.00 | 663.00 | 1586.00 |
| 25% | 4187.25 | 2976.00 | 7163.25 |
| 50% | 10999.00 | 8540.00 | 19539.00 |
| 75% | 15971.25 | 12808.50 | 28779.75 |
| max | 20398.00 | 16872.00 | 37270.00 |
Casos - Centro-Oeste
| Homens | Mulheres | Total | |
|---|---|---|---|
| count | 10.00 | 10.00 | 10.00 |
| mean | 3732.80 | 2063.00 | 5795.80 |
| std | 3021.05 | 1610.23 | 4625.76 |
| min | 509.00 | 350.00 | 859.00 |
| 25% | 1089.25 | 750.75 | 1840.00 |
| 50% | 3000.50 | 1587.00 | 4587.50 |
| 75% | 6113.75 | 3097.75 | 9211.50 |
| max | 8288.00 | 4569.00 | 12857.00 |
Casos - Brasil
| Homens | Mulheres | Total | |
|---|---|---|---|
| count | 10.00 | 10.00 | 10.00 |
| mean | 51021.80 | 33836.60 | 84858.40 |
| std | 30989.55 | 20795.01 | 51721.63 |
| min | 10987.00 | 7222.00 | 18209.00 |
| 25% | 25202.00 | 16923.00 | 42125.00 |
| 50% | 47879.00 | 32288.00 | 80167.00 |
| 75% | 72303.75 | 48409.00 | 120378.25 |
| max | 94906.00 | 64225.00 | 159131.00 |
Para os testes de hipótese, foi utilizada a biblioteca SciPy, que possui nível de significância padrão igual a 5%, valor que foi mantido nos cálculos.
# Listas criadas para a funcao auxiliar
regiao = []
genero = []
reg_gen = []
p_valor_reg = []
p_valor_gen = []
# Função auxilixar para avaliar a rejeição da normalidade
avalia_p_val = lambda p_val: 'Rejeita' if p_val < 0.05 else 'Não rejeita'
avalia_normal_reg = []
avalia_normal_gen = []
for reg in data_taxas['Região'].drop_duplicates():
regiao.append(reg)
p_val = st.shapiro(data_taxas[data_taxas['Região'] == reg]['Infecções por 100 mil habitantes'])[1]
p_valor_reg.append(p_val)
avalia_normal_reg.append(avalia_p_val(p_val))
for gen in data_casos[data_casos['Gênero'] != 'Total']['Gênero'].drop_duplicates():
reg_gen.append(reg)
genero.append(gen)
p_val = st.shapiro(data_casos[(data_casos['Gênero'] == gen) & (data_casos['Região'] == reg)]['Casos'])[1]
p_valor_gen.append(p_val)
avalia_normal_gen.append(avalia_p_val(p_val))
normalidade_regiao = pd.DataFrame({'Região': regiao, 'p-Valor': p_valor_reg, 'Avaliação da Normalidade': avalia_normal_reg})
normalidade_genero = pd.DataFrame({'Região': reg_gen, 'Gênero': genero, 'p-Valor': p_valor_gen, 'Avaliação da Normalidade': avalia_normal_gen})
print('Avaliação da normalidade da districuição das taxas de cada região')
display(normalidade_regiao)
print('\n\n')
print('Avaliação da normalidade dos números de casos dentre gêneros districuição das taxas de cada região')
display(normalidade_genero)
Avaliação da normalidade da districuição das taxas de cada região
| Região | p-Valor | Avaliação da Normalidade | |
|---|---|---|---|
| 0 | Norte | 0.118147 | Não rejeita |
| 1 | Nordeste | 0.111035 | Não rejeita |
| 2 | Sudeste | 0.599796 | Não rejeita |
| 3 | Sul | 0.445532 | Não rejeita |
| 4 | Centro-Oeste | 0.163378 | Não rejeita |
| 5 | Brasil | 0.471106 | Não rejeita |
Avaliação da normalidade dos números de casos dentre gêneros districuição das taxas de cada região
| Região | Gênero | p-Valor | Avaliação da Normalidade | |
|---|---|---|---|---|
| 0 | Norte | Homens | 0.090236 | Não rejeita |
| 1 | Norte | Mulheres | 0.114231 | Não rejeita |
| 2 | Nordeste | Homens | 0.053546 | Não rejeita |
| 3 | Nordeste | Mulheres | 0.303176 | Não rejeita |
| 4 | Sudeste | Homens | 0.573355 | Não rejeita |
| 5 | Sudeste | Mulheres | 0.553252 | Não rejeita |
| 6 | Sul | Homens | 0.402133 | Não rejeita |
| 7 | Sul | Mulheres | 0.411043 | Não rejeita |
| 8 | Centro-Oeste | Homens | 0.135921 | Não rejeita |
| 9 | Centro-Oeste | Mulheres | 0.125890 | Não rejeita |
| 10 | Brasil | Homens | 0.382930 | Não rejeita |
| 11 | Brasil | Mulheres | 0.466883 | Não rejeita |
Conforme esperávamos a partir da avaliação dos gráficos acima, os testes de Shaprio-Wilk não rejeitaram a normalidade para nenhuma distribuição desta análise. Logo, todas as distribuições utilizadas foram consideradas como normais.
Inicialmente, será feito o teste de Levene para verificar a hipótese de igual para as variâncias das taxas médias de infecções considerando as 5 regiões.
# Teste de homocedasticidade
taxas_por_região = []
for i in data_taxas[data_taxas['Região'] != 'Brasil']['Região'].drop_duplicates():
taxas_por_região.append(data_taxas[(data_taxas['Região'] == i)]['Infecções por 100 mil habitantes'])
st.levene(taxas_por_região[0], taxas_por_região[1], taxas_por_região[2], taxas_por_região[3], taxas_por_região[4])
# 0: Norte, 1: Nordeste, 2: Sudeste, 3: Sul, 4: Centro-Oeste
LeveneResult(statistic=4.2462173090360755, pvalue=0.005322210866567718)
Como era esperado pela análise dos boxplots, foi rejeitada a igualdade das variâncias entre as distribuições de taxas ao longo dos anos para cada região. Sendo assim, o teste ANOVA não seria indicado para esses dados, mas para fins didáticos o aplicamos em nossa base de dados. Como resultado é esperado que seja rejeitada fortemente a igualdade, entre as regiões, nas médias das taxas de infecções.
# Teste ANOVA
st.f_oneway(taxas_por_região[0], taxas_por_região[1], taxas_por_região[2], taxas_por_região[3], taxas_por_região[4])
F_onewayResult(statistic=4.245662402936611, pvalue=0.005326065973163437)
Como previsto, o p-valor da ANOVA deu muito abaixo de 0.05 e a igualdade entre as taxas médias das regiões foi rejeitada. Lembrando que este teste foi feito apenas para ilustração, visto que a condição de homocedasticidade foi rejeitada, condição necessária para realizar o teste ANOVA.
Adicionalmente, como a homocedasticidade das taxas médias entre as regiões foi rejeitada, foi feito um teste de Kruskal-Wallis para determinar se as distribuições das taxas médias podem ser consideradas iguais.
# Teste Kruskal-Wallis
st.kruskal(taxas_por_região[0], taxas_por_região[1], taxas_por_região[2], taxas_por_região[3], taxas_por_região[4])
KruskalResult(statistic=12.696844986553986, pvalue=0.012856100543235514)
Novamente, o p-valor ficou abaixo de 0.05 e a igualdade de distribuição das taxas médias entre as regiões foi rejeitada. Portanto, as distribuições das taxas de infecção por região foram tomadas duas a duas para a realização de Testes $t$ para a igualdade das taxas médias.
O Teste $t$ no SciPy permite a consideração de variâncias iguais através do parâmetro equal_var. Assim, criou-se a função lâmbda avalia_equal_var para determinar o valor desse parâmetro a partir do p-valor obtido com o teste de Levene para a homecedasticidade entre cada par possível de regiões.
Ao todo, existem 10 pares distintos entre as 5 regiões, ou seja, foram realizados 10 testes em sequência para a comparação das taxas médias entre as regiões. Assim, para avaliar a hipótese nula, será adotada a correção de Bonferroni para a significância dos testes, que consiste em dividir o valor de $\alpha$ de cada teste pelo número total $n$ de teste. Neste caso, a nova significância passou a ser igual a 0.005 e foi com este valor que avaliamos a rejeição da igualdade das taxas médias, comparando-o com os p-valores obtidos em cada teste.
# Teste t
regioes = data_taxas[(data_taxas['Região'] != 'Brasil')]['Região'].drop_duplicates().reset_index(drop=True)
p_valor_ttest = [] #Lista dos p-valores dos Testes T para igualdade entre as taxas médias das regiões
regs_comparadas = [] #Lista com os nomes da regiões comparadas
avalia_equal_var = [] #Para determinar se o Teste T vai considerar variâncias iguais
p_val_vars = [] #P-valores do teste de Levene para as taxas médias das regiões
for i in range(len(regioes)):
for j in range(i+1,len(regioes)):
regs_comparadas.append(regioes[i] +' e '+ regioes[j])
p_valor = st.levene(data_taxas[data_taxas['Região'] == regioes[i]]['Infecções por 100 mil habitantes'], data_taxas[data_taxas['Região'] == regioes[j]]['Infecções por 100 mil habitantes'])[1].round(4)
aux_avalia_equal_var = lambda p_valor: True if p_valor >= 0.05 else False
p_val_vars.append(p_valor)
avalia_equal_var.append(aux_avalia_equal_var(p_valor))
p_valor_ttest.append(st.ttest_ind(data_taxas[data_taxas['Região'] == regioes[i]]['Infecções por 100 mil habitantes'],\
data_taxas[data_taxas['Região'] == regioes[j]]['Infecções por 100 mil habitantes'], equal_var = aux_avalia_equal_var(p_valor))[1].round(4))
n_testes = len(p_valor_ttest) #Número de testo realizados
a_bonferroni = 0.05/n_testes #Correção de Bonferroni
avalia_ttest = [] #Lista para avaliar a rejeição da igualdade entre as taxas médias das regiões
aux_avalia_ttest = lambda i: 'Rejeita' if i < a_bonferroni else 'Não rejeita' # Função para auxiliar nas avalições das rejeições da hipótese nula
for i in range(n_testes):
avalia_ttest.append(aux_avalia_ttest(p_valor_ttest[i]))
teste_t_regiao = pd.DataFrame({'Comparação': regs_comparadas,'p-Valor das Variâncias': p_val_vars, 'Variâncias Iguais?': avalia_equal_var, 'p-Valor dos Testes t': p_valor_ttest, 'Avaliação do Teste t (com correção de Bonferroni)': avalia_ttest})
display(teste_t_regiao)
| Comparação | p-Valor das Variâncias | Variâncias Iguais? | p-Valor dos Testes t | Avaliação do Teste t (com correção de Bonferroni) | |
|---|---|---|---|---|---|
| 0 | Norte e Nordeste | 0.3740 | True | 0.4992 | Não rejeita |
| 1 | Norte e Sudeste | 0.6389 | True | 0.0197 | Não rejeita |
| 2 | Norte e Sul | 0.0174 | False | 0.0253 | Não rejeita |
| 3 | Norte e Centro-Oeste | 0.3389 | True | 0.3326 | Não rejeita |
| 4 | Nordeste e Sudeste | 0.1352 | True | 0.0027 | Rejeita |
| 5 | Nordeste e Sul | 0.0028 | False | 0.0112 | Não rejeita |
| 6 | Nordeste e Centro-Oeste | 0.0724 | True | 0.1180 | Não rejeita |
| 7 | Sudeste e Sul | 0.0284 | False | 0.4121 | Não rejeita |
| 8 | Sudeste e Centro-Oeste | 0.5460 | True | 0.2278 | Não rejeita |
| 9 | Sul e Centro-Oeste | 0.1047 | True | 0.1084 | Não rejeita |
Assim, com a correção de Bonferroni, apenas a igualdade das taxas médias de infecções entre as regiões Nordeste e Sudeste foi rejeitada.
Desconsiderando a correção de Bonferroni, também seriam rejeitadas as igualdades das taxas médias entre as regiões Norte e Sudeste, Norte e Sul, Nordeste e Sudeste (novamente), além de Nordeste e Sul. Esses são resultados esperados porque, conforme visto nos boxplots, as regiões Norte e Nordeste possuem os menores valores máximos de taxa de infecção e as menores variabilidades nas taxas, enquanto as regiões Sul e Sudeste possuem um comportamento oposto.
Algumas possibilidades de explicação para os resultados obtidos até aqui:
Por fim, para as médias de casos por gênero ao longo dos anos para cada região (e para o Brasil), foram feitos os testes de homocedasticidade e, posteriormente, os Testes $t$ para comparação das médias.
# Levene para os gêneros
casos_homens = []
casos_mulheres = []
levene_generos = []
avalia_var_gen = []
count = 0
for i in data['Região'].drop_duplicates():
casos_homens.append(data_casos[(data_casos['Gênero'] == 'Homens') & (data_casos['Região'] == i)]['Casos'])
casos_mulheres.append(data_casos[(data_casos['Gênero'] == 'Mulheres') & (data_casos['Região'] == i)]['Casos'])
p_val = st.levene(casos_homens[count], casos_mulheres[count])[1].round(4)
levene_generos.append(p_val)
avalia_var_gen.append(avalia_p_val(p_val))
count += 1
homoceda_gens = pd.DataFrame({'Região': data['Região'].drop_duplicates().reset_index(drop=True), 'p-Valor': levene_generos, 'Avaliação da igualdade das variâncias': avalia_var_gen})
display(homoceda_gens)
| Região | p-Valor | Avaliação da igualdade das variâncias | |
|---|---|---|---|
| 0 | Norte | 0.2200 | Não rejeita |
| 1 | Nordeste | 0.2437 | Não rejeita |
| 2 | Sudeste | 0.0789 | Não rejeita |
| 3 | Sul | 0.4399 | Não rejeita |
| 4 | Centro-Oeste | 0.0564 | Não rejeita |
# Teste T para os gêneros
p_valor_ttest_casos_gen = []
avalia_med_gen = []
for i in range(len(data['Região'].drop_duplicates())):
p_val = st.ttest_ind(casos_homens[i], casos_mulheres[i], equal_var = True)[1].round(4)
p_valor_ttest_casos_gen.append(p_val)
avalia_med_gen.append(avalia_p_val(p_val))
homoceda_gens = pd.DataFrame({'Região': data['Região'].drop_duplicates().reset_index(drop=True), 'p-Valor dos Testes T': p_valor_ttest_casos_gen, 'Avaliação da igualdade das médias de casos': avalia_med_gen})
display(homoceda_gens)
# display(avalia_med_gen)
| Região | p-Valor dos Testes T | Avaliação da igualdade das médias de casos | |
|---|---|---|---|
| 0 | Norte | 0.3422 | Não rejeita |
| 1 | Nordeste | 0.5193 | Não rejeita |
| 2 | Sudeste | 0.0381 | Rejeita |
| 3 | Sul | 0.4572 | Não rejeita |
| 4 | Centro-Oeste | 0.1404 | Não rejeita |
A igualdade das médias de casos por gênero ao longo dos anos foi rejeitada apenas na região Sudeste, o que era esperado, já que a mediana e o valor máximo de casos entre os homens estavam muito acima dos valores exibidos para as mulheres no boxplot apresentado acima. Nas demais regiões, não foi possível rejeitar a igualdade entre as médias de casos por gênero através do Teste $t$.
Neste caso, podemos trazer três fatores como explicação do aumento da incidência da sífilis no Brasil nesses ultimos anos. Um deles é a diminuição do uso do preservativo, que passa a ser uma tendência mundial. Um segundo motivo ocorreu pela falta em alguns anos do antibiótico mais eficaz contra a bactéria da sífilis, isto fez com que muitas pessoas infectadas pela bactéria não tivessem acesso precoce ao tratamento, e aumentassem a cadeia de transmissão. Por fim, houve diminuição de campanhas de prevenção às Infecções sexualmente transmissíveis. Portanto, a melhor forma de minimizar esses casos ainda seria o uso de campanhas governamentais de prevenção às doenças sexualmente transmissíveis, promovendo um maior impacto sobre a consciência da população.